# ---- Build stage ----
# 注意：如果网络访问 Docker Hub 有问题，可以不使用 BuildKit 语法声明
# 但仍然可以通过 DOCKER_BUILDKIT=1 环境变量启用 BuildKit 特性
FROM docker.m.daocloud.io/library/golang:1.22-alpine AS builder
WORKDIR /src

# 设置国内镜像源加速
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories && \
    apk add --no-cache git

# 设置Go模块代理
ENV GOPROXY=https://goproxy.cn,direct

# 预拉 go 依赖，利用Docker缓存层加速构建
COPY webhook-runner/go.mod webhook-runner/go.sum ./webhook-runner/
RUN cd webhook-runner && go mod download

# 拷贝源码并编译 webhook-runner
COPY webhook-runner/ ./webhook-runner/
WORKDIR /src/webhook-runner

# 编译 webhook-runner
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build \
    -ldflags="-w -s" \
    -o /out/webhook-runner ./main.go

# ---- Runtime stage ----
FROM docker.m.daocloud.io/library/alpine:3.20

# 设置环境变量
ENV TZ=Asia/Shanghai \
    PRSENTINEL_HOME=/app \
    NODE_ENV=production \
    PYTHONUNBUFFERED=1

# 设置国内镜像源加速
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories

# 安装运行时依赖
RUN apk add --no-cache \
        bash \
        nodejs \
        npm \
        git \
        jq \
        curl \
        ca-certificates \
        tzdata \
        busybox-extras

# 配置 npm 并尝试安装 claude-cli
RUN npm config set registry https://registry.npmmirror.com && \
    (npm install -g @anthropic-ai/claude-code 2>/dev/null || \
     npm install -g claude-ai 2>/dev/null || \
     echo "Warning: claude-cli installation failed, will configure in entrypoint") && \
    npm cache clean --force && \
    rm -rf /root/.npm /tmp/*

# 创建非root用户并设置权限
RUN addgroup -S app -g 1001 && \
    adduser -S app -G app -u 1001 -h /app

WORKDIR /app

# 复制编译产物（作为root用户确保权限正确）
COPY --from=builder --chown=app:app /out/webhook-runner ./webhook-runner/webhook-runner

# 复制项目文件（按变动频率排序，不常变的先复制）
# 复制 MCP 配置（基本不变）
COPY --chown=app:app mcp/ ./mcp/
# 复制评审标准（较少变动）
COPY --chown=app:app review/ ./review/
# 复制脚本文件（可能变动）
COPY --chown=app:app scripts/ ./scripts/
COPY --chown=app:app start_review.sh run.sh ./
# 复制入口脚本（可能频繁调整）
COPY --chown=app:app docker-entrypoint.sh /usr/local/bin/entrypoint.sh

# 创建必需的目录结构并设置权限
RUN mkdir -p logs/webhooks logs/reviews logs/debug score /tmp/pr-sentinel && \
    chown -R app:app logs score /tmp/pr-sentinel && \
    chmod +x webhook-runner/webhook-runner start_review.sh run.sh /usr/local/bin/entrypoint.sh && \
    chmod +x scripts/*.sh 2>/dev/null || true && \
    chmod +x mcp/*.sh 2>/dev/null || true

# 切换到非root用户
USER app

# 暴露端口
EXPOSE 9002

# 健康检查（优化检查逻辑）
HEALTHCHECK --interval=30s --timeout=5s --start-period=30s --retries=3 \
  CMD wget --no-verbose --tries=1 --spider http://127.0.0.1:${LISTEN_PORT:-9002}/health || exit 1

# 设置入口点和默认命令
ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]
CMD []